接下來的資料結構時做都需要主索引為partition key&sort key,所以先建立一個單純的資料表進行操作。
var params = {
"TableName": "table2",
KeySchema: [
{
AttributeName: "pk",
KeyType: "HASH"
},
{
AttributeName: "sk",
KeyType: " RANGE"
}
],
AttributeDefinitions: [
{
AttributeName: "pk",
AttributeType: "S"
},
{
AttributeName: "sk",
AttributeType: "S"
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1
}
};
dynamodb.createTable(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
因為我打算在同一個資料表存不同類的項目資料,所以先準備個父類別定義核心的主索引部分
@DynamoDBTable(tableName = "table2")
public class BaseTimeBean {
@JsonIgnore
@DynamoDBHashKey(attributeName = "pk")
private String pk;
@JsonIgnore
@DynamoDBRangeKey(attributeName = "sk")
@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.CREATE)
private Date sk;
public String getPk() {
return pk;
}
public void setPk(String pk) {
this.pk = pk;
}
@JsonGetter("datetime")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss")
public Date getSk() {
return sk;
}
public void setSk(Datesk) {
this.sk = sk;
}
}
你會注意到,在Java的Date,在DynamoDB對應的attribute type是string,Date 值會以 ISO-8601 格式字串存放。而且時間序列資料原則上我們只會新增項目,所以sk可以很乾脆的直接使用generated。
另外一方面,API當中我們只希望date在response當中出現,所以僅使用Getter註釋。
新增一個子類繼承BaseTimeBean
public class Message extends BaseTimeBean {
@DynamoDBIgnore
public String getCatalog() {
return this.getPk();
}
@DynamoDBIgnore
public void setCatalog(String catalog) {
this.setPk(catalog);
}
private String topic;
private String message;
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
這邊要注意的是,因為註釋可以繼承,不需要再註釋tablename。而catalog是在message意義上的pk,所以用新的get/set替代。